<!--
Copyright (c) 2020 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Character Set</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<script src="../../../js/js-test-pre.js"></script>
<script src="../../../js/webgl-test-utils.js"></script>
<script src="../../../js/glsl-conformance-test.js"></script>
</head>
<body>

<script id="fs-invalid-0" type="x-shader/x-fragment">
precision mediump float;
$
void main() {
  gl_FragColor = vec4(1, 0, 0, 1);
}
</script>

<script id="fs-invalid-1" type="x-shader/x-fragment">
precision mediump float;
一些注释
void main() {
  gl_FragColor = vec4(1, 0, 0, 1);
}
</script>

<script id="fs-invalid-2" type="x-shader/x-fragment">
precision mediump float;
#if defined(NOT_DEFINED_FOO)
一些注释
#endif
void main() {
  gl_FragColor = vec4(1, 0, 0, 1);
}
</script>

<script id="fs-comment-valid" type="x-shader/x-fragment">
precision mediump float;
// some comment: asdf1234~!@#$%^&*()-=[];',./{}:"?><_+
// some comment: 一些注释 (╯‵□′)╯︵┻━┻
// some comment: \\\\\\\\\
// some comment: \n\\r\n
void main() {
  gl_FragColor = vec4(1, 0, 0, 1);
}
</script>

<script id="fs-cleared-by-preprocessing-valid" type="x-shader/x-fragment">
precision mediump float;
#if defined(GL_GOOGLE_cpp_style_line_directive)
#line 9 "foo.txt"
#endif
void main() {
  gl_FragColor = vec4(1, 0, 0, 1);
}
</script>

<div id="description"></div>
<div id="console"></div>
<canvas id="canvas" width="2" height="2"> </canvas>
<script>
"use strict";
// See http://crbug.com/1108588 for original failing case.
// Check "OpenGL Registry The OpenGL ES Shading Language"
// Section 3.2 Character Sets For more info
description("This test checks character set validation for glsl.");

debug("");
debug("Canvas.getContext");

let wtu = WebGLTestUtils;
let gl = wtu.create3DContext("canvas");
let consoleDiv = document.getElementById("console");
if (!gl) {
  testFailed("context does not exist");
} else {
  testPassed("context exists");

  debug("");
  debug("Checking shader character set validation and compilation");

  runTest();
}

function testShaderSource(shaderId, expected, msg) {
    let shaderSource = document.getElementById(shaderId).text;
    if (!quietMode()) {
        wtu.addShaderSource(consoleDiv, "test fragment shader", shaderSource);
    }

    let shader = gl.createShader(gl.FRAGMENT_SHADER);
    if (shader == null) {
        testFailed("*** Error: unable to create shader '" + shaderSource + "'");
        return;
    }

    gl.shaderSource(shader, shaderSource);
    wtu.glErrorShouldBe(gl, expected, msg);
}

function runTest() {

    testShaderSource('fs-invalid-0', gl.INVALID_VALUE, 'Unallowed characters detected');
    testShaderSource('fs-invalid-1', gl.INVALID_VALUE, 'Unallowed characters detected');
    testShaderSource('fs-invalid-2', gl.INVALID_VALUE, 'Non ASCII characters detected that would be cleared by preprocessing step is still invalid');

    GLSLConformanceTester.runTests([
        {
            fShaderId: 'fs-comment-valid',
            fShaderSuccess: true,
            linkSuccess: true,
            passMsg: 'Unallowed characters and UTF-8 characters in comment are valid'
        },
        {
            fShaderId: 'fs-cleared-by-preprocessing-valid',
            fShaderSuccess: true,
            linkSuccess: true,
            passMsg: 'Unsupported shader extensions (with invalid ASCII characters) cleared by preprocessing step is valid'
        },
    ]);
}

debug("");
var successfullyParsed = true;

</script>
<script src="../../../js/js-test-post.js"></script>

</body>
</html>
